﻿Imports MySql.Data.MySqlClient

Public Class Form1

    Public kundeliste As New List(Of Kunde)
    Private kakeoppskrifter As New List(Of KakeOppskrift)
    Public valgtKunde As New Kunde()
    Private valgtBruker As Ansatt
    Private tempTable As DataTable
    Public innloggetBruker As Ansatt
    Private ingredienser As New List(Of Ingrediens)
    Private valgtIngrediens As String = ""

    Public Sub New()

        ' This call is required by the designer.
        InitializeComponent()

        ingredienser = Ingrediens.FinnAlle()
        For Each i In ingredienser
            cboVelgRavare.Items.Add(i.navn)
            'i.sjekkMengde(100) 'melding hvis lagerbeholdning under denne grensen
        Next
        Ansatt.Selgerrapport(dgvSelgerRapport) 'NB sender inn referanse og ikke variabel

    End Sub

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        FrmLoggInn.ShowDialog() 'Kjører innloggingsbildet ved åpning av programmet

        If innloggetBruker Is Nothing Then
            MsgBox("Du må være logget inn for å gå videre")
            End
        End If

        'Tilgangsstyring til adminfunksjoner:
        If innloggetBruker.rolle_admin = 0 Then 'Fjerner muligheten for å se enkelte faner for andre enn admin-rollen
            TabControl1.TabPages.Remove(TabBrukeradministrasjon)
            TabControl1.TabPages.Remove(TabGlobaleInnstillinger)
            TabControl1.TabPages.Remove(TabSelgerrapport)
            TabControl1.TabPages.Remove(TabØkonomirapport)
            tsbBrukeradministrasjon.ToolTipText = "Endre eget passord."
            grpBoxAdminLager.Visible = False

        End If
        'kundeliste = Kunde.FinnAlle()
    End Sub

    '********************************************************************************************
    'Her begynner kode for ToolStripMenyen:

    Private Sub OmToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles OmToolStripMenuItem.Click
        Dim omTekst As String = "Dette er en prosjektoppgave i forbindelse med faget Objektorientert programmering med systemarbeid "
        omTekst &= "Utført av Espen Liland Bjørnsen og Harald Tverfjell"
        MsgBox(omTekst)
    End Sub

    Private Sub AvslutttToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles AvsluttToolStripMenuItem.Click
        Me.Close()
    End Sub

    Private Sub tsbKunderegister_Click(sender As Object, e As EventArgs) Handles tsbKunderegister.Click
        TabControl1.SelectedTab = TabKunderegister

    End Sub

    Private Sub tsbPakking_Click(sender As Object, e As EventArgs) Handles tsbPakking.Click
        TabControl1.SelectedTab = TabPakking

    End Sub

    Private Sub tsbKjøreliste_Click(sender As Object, e As EventArgs) Handles tsbKjøreliste.Click
        TabControl1.SelectedTab = TabKjøreliste

    End Sub

    Private Sub tsbRavarelager_Click(sender As Object, e As EventArgs) Handles tsbRavarelager.Click
        TabControl1.SelectedTab = TabRåvarelager
    End Sub

    Private Sub tsbSelgerrapport_Click(sender As Object, e As EventArgs) Handles tsbSelgerrapport.Click
        TabControl1.SelectedTab = TabSelgerrapport
    End Sub

    Private Sub tsbØkonomirapport_Click(sender As Object, e As EventArgs) Handles tsbØkonomirapport.Click
        TabControl1.SelectedTab = TabØkonomirapport
    End Sub

    Private Sub tsbBrukeradministrasjon_Click(sender As Object, e As EventArgs) Handles tsbBrukeradministrasjon.Click
        Try
            If innloggetBruker.rolle_admin = True Then
                'Bare admin-brukere kommer inn i skjermbildet for brukersdministrasjon
                TabControl1.SelectedTab = TabBrukeradministrasjon
                TabBrukeradministrasjonLoad()

            Else 'Hvis inloggetBruker ikke har admin-rolle kan man bare bytte eget passord
                Dim sjekkPassord, nyttPassord1, nyttPassord2 As String

                sjekkPassord = InputBox("Oppgi ditt nåværende passord:", " Endre passord")
                If sjekkPassord = "" Then
                    Exit Try
                ElseIf innloggetBruker.passord = sjekkPassord Then
                    nyttPassord1 = InputBox("Riktig! Oppgi ditt nye passord:", "Endre passord")
                    If nyttPassord1 = "" Then
                        Exit Try
                    Else : nyttPassord2 = InputBox("OK, men gjenta ditt nye passord:", "Endre passord")
                        If nyttPassord2 = "" Then
                            Exit Try
                        ElseIf nyttPassord1 = nyttPassord2 Then
                            innloggetBruker.passord = nyttPassord2
                            innloggetBruker.Lagre()
                            MsgBox("Ditt passord er nå endret.")
                        Else
                            MsgBox("Feil! Ikke samsvar mellom føsrte og andre inntasting av nytt passord.")
                        End If
                    End If
                Else
                    MsgBox("Feil passord!")
                End If
            End If

        Catch ex As Exception
            MsgBox("Dette blei feil fordi:" & ex.Message)

        End Try

    End Sub

    Private Sub tsbGlobaleInnstillinger_Click(sender As Object, e As EventArgs) Handles tsbGlobaleInnstillinger.Click
        TabControl1.SelectedTab = TabGlobaleInnstillinger
    End Sub

    Private Sub tsbLoggUt_Click(sender As Object, e As EventArgs) Handles tsbLoggUt.Click
        innloggetBruker = Nothing
        MsgBox("Du er logget ut, og programmet avsluttes!")
        End
    End Sub

    'Her slutter kode for ToolStripMenyen.
    '************************************************************************************************

    '************************************************************************************************
    'Her begynner kode for Tab-sidenes Load-rutiner:

    Private Sub TabControl1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles TabControl1.SelectedIndexChanged
        'Kobler sammen fane-overskriftene med ToolStripMeny-knappene ved å kjøre Load-rutinen til fanene
        If TabControl1.SelectedIndex = 0 Then
            TabKunderegisterLoad()
        ElseIf TabControl1.SelectedIndex = 1 Then
            TabPakkingLoad()
        ElseIf TabControl1.SelectedIndex = 2 Then
            TabKjørelisteLoad()
        ElseIf TabControl1.SelectedIndex = 3 Then
            TabRavarelagerLoad()
        ElseIf TabControl1.SelectedIndex = 4 Then
            TabSelgerrapportLoad()
        ElseIf TabControl1.SelectedIndex = 5 Then
            TabØkonomirapportLoad()
        ElseIf TabControl1.SelectedIndex = 6 Then
            TabBrukeradministrasjonLoad()

        End If
    End Sub

    Private Sub TabKunderegisterLoad()
        dgvFinnKunde.DataSource = Nothing
        dgvBestillinger.DataSource = Nothing
        For Each ctrl In grpFinnKunde.Controls
            If TypeOf ctrl Is TextBox Then
                ctrl.text = ""
            End If
        Next
        For Each ctrl In grpValgtKunde.Controls
            If TypeOf ctrl Is TextBox Then
                ctrl.text = ""
            End If
        Next

    End Sub

    Private Sub TabPakkingLoad()
        btnVelgPakkejobb.Enabled = True
        grpPakking.Visible = False
        btnEtikett.Visible = False

    End Sub

    Private Sub TabKjørelisteLoad()
        'Er ikke i bruk
    End Sub

    Private Sub TabRavarelagerLoad()
        lblRavareinfo.Text = "" ' nuller ut innhold
        btnEndreRavare.Visible = False 'skal ikke vises før råvare er valgt

        ingredienser = Ingrediens.FinnAlle()
        cboVelgRavare.Items.Clear()
        For Each i In ingredienser
            cboVelgRavare.Items.Add(i.navn)
            i.sjekkMengde(1) 'melding hvis lagerbeholdning under denne grensen
        Next
        dgvRavarelager.DataSource = ingredienser

        Dim sporring As String = "SELECT * FROM varekjop ORDER BY vareKjopId DESC Limit 15"

        dgvRavarebestillinger.DataSource = Database.Query(sporring)
    End Sub

    Private Sub TabSelgerrapportLoad()

        'Dim sporring As String = "SELECT ansattNr, COUNT(*) AS Antall_Salg, SUM(varesalgsBelop) AS SumKroner FROM varesalg GROUP BY ansattNr"
        Dim sporring As String = "SELECT ansattNr, personForNavn, personEtterNavn, COUNT(*) AS Antall_Salg, SUM(varesalgsBelop) AS SumKroner FROM varesalg, person"
        sporring &= " WHERE personId = ansattNr GROUP BY ansattNr"
        dgvSelgerRapport.DataSource = Database.Query(sporring)
    End Sub

    Private Sub TabØkonomirapportLoad()
        'Er ikke i bruk
    End Sub

    Private Sub TabBrukeradministrasjonLoad()
        dgvAnsattListe.DataSource = Database.Query("SELECT person.personId, person.personForNavn, person.personEtternavn FROM ansatt INNER JOIN person WHERE person.personId = ansatt.ansattNr")

    End Sub

    'Her slutter kode for Tab-sidenes Load-rutiner
    '*******************************************************************************************************

    '********************************************
    'Her begynner kode for Kunderegister:

    Private Sub kundeSøk()
        tempTable = Kunde.Finn(txtFinnKundeFornavn.Text, txtFinnKundeEtterNavn.Text, txtFinnKundeAdresse.Text, txtFinnKundeEpost.Text, txtFinnKundeMobilNr.Text)

        Dim synligeKolonner As String() = {"personId", "personForNavn", "personEtterNavn", "personEpost"}
        Dim visTabell As DataTable = tempTable.Clone()

        For index As Integer = visTabell.Columns.Count - 1 To 0 Step -1
            Dim kolonneNavn As String = visTabell.Columns(index).ColumnName
            If Not synligeKolonner.Contains(kolonneNavn) Then
                visTabell.Columns.RemoveAt(index)
            End If
        Next

        visTabell.Merge(tempTable, False, MissingSchemaAction.Ignore)
        dgvFinnKunde.DataSource = visTabell

        With dgvFinnKunde.Columns
            .Item("personId").Width = 30
            .Item("personForNavn").Width = 80
            .Item("personEtterNavn").Width = 110
            .Item("personEpost").Width = 170
        End With
        For i = 0 To dgvFinnKunde.Columns.Count - 1
            dgvFinnKunde.Columns.Item(i).SortMode = DataGridViewColumnSortMode.NotSortable
        Next
    End Sub

    Private Sub btnSøkEtterKunde_Click(sender As Object, e As EventArgs) Handles btnSøkEtterKunde.Click
        kundeSøk()
    End Sub

    Private Sub btnNullstill_Click(sender As Object, e As EventArgs) Handles btnNullstill.Click
        FlushSøkKundeTekstfelt()
    End Sub

    Private Sub FlushValgtKundeTekstfelt()
        txtValgtKundeFornavn.Text = ""
        txtValgtKundeEtternavn.Text = ""
        txtValgtKundeAdresse.Text = ""
        txtValgtKundeEpost.Text = ""
        txtValgtKundeMobil.Text = ""
        txtValgtKundeFakturaAdresse.Text = ""
        txtValgtKundeRabatt.Text = ""
        txtValgtKundeAbonnement.Text = ""

    End Sub

    Private Sub FlushSøkKundeTekstfelt()
        txtFinnKundeFornavn.Text = ""
        txtFinnKundeEtterNavn.Text = ""
        txtFinnKundeAdresse.Text = ""
        txtFinnKundeEpost.Text = ""
        txtFinnKundeMobilNr.Text = ""
        TextBox2.Text = ""

    End Sub

    Private Sub btnOpprettNyKunde_Click(sender As Object, e As EventArgs) Handles btnOpprettNyKunde.Click
        btnLagreEndretKundeInfo.Visible = False 'kan ikke lagre endringer før kunde er valgt
        dgvBestillinger.DataSource = Nothing ' tømmer vundu for tidligere kunde opplysninger
        dgvFinnKunde.DataSource = Nothing ' tømmer vundu for tidligere kunde opplysninger

        FlushValgtKundeTekstfelt()


        If Not Valider.sjekkNavnefelt(txtFinnKundeFornavn.Text) Then
            MsgBox("Feil navneformat på fornavn")
            Exit Sub
        End If
        If Not Valider.sjekkNavnefelt(txtFinnKundeEtterNavn.Text) Then
            MsgBox("Feil navneformat på etternavn")
            Exit Sub
        End If
        If Not Valider.sjekkEpost(txtFinnKundeEpost.Text) Then
            MsgBox("Feil format på e-post")
            Exit Sub
        End If
        If Not Valider.sjekkTelefonfelt(txtFinnKundeMobilNr.Text) Then
            MsgBox("Ikke norsk nummer")
            Exit Sub
        End If
        If Not Valider.sjekkAdressefelt(txtFinnKundeAdresse.Text) Then
            MsgBox("Feil format i adresse felt")
            Exit Sub
        End If
        If Not Valider.sjekkAdressefelt(TextBox2.Text) Then
            MsgBox("Feil format i faktura adresse felt")
            Exit Sub
        End If



        Dim nyKunde As New Kunde()
        nyKunde.fornavn = txtFinnKundeFornavn.Text
        nyKunde.etternavn = txtFinnKundeEtterNavn.Text
        nyKunde.epost = txtFinnKundeEpost.Text
        nyKunde.adresse = txtFinnKundeAdresse.Text
        nyKunde.fakturaadresse = TextBox2.Text
        nyKunde.mobil = txtFinnKundeMobilNr.Text
        nyKunde.abonnementID = 0
        nyKunde.rabattFaktor = 1

        nyKunde.Lagre()

        kundeSøk() ' oppfrisker søkevindu
        dgvBestillinger.DataSource = Nothing ' tømmer vindu for tidligere kundeopplysninger

    End Sub

    Private Sub btnLagreEndretKundeInfo_Click(sender As Object, e As EventArgs) Handles btnLagreEndretKundeInfo.Click
        valgtKunde.fornavn = txtValgtKundeFornavn.Text
        valgtKunde.etternavn = txtValgtKundeEtternavn.Text
        valgtKunde.adresse = txtValgtKundeAdresse.Text
        valgtKunde.epost = txtValgtKundeEpost.Text
        valgtKunde.mobil = txtValgtKundeMobil.Text
        valgtKunde.fakturaadresse = txtValgtKundeFakturaAdresse.Text
        valgtKunde.rabattFaktor = CDbl(txtValgtKundeRabatt.Text.Replace(".", ",")) 'Bytter ut eventuelle punktum med komma for å kunne konvertere til datatypen double
        valgtKunde.abonnementID = CInt(txtValgtKundeAbonnement.Text)

        valgtKunde.Lagre()
        btnLagreEndretKundeInfo.Visible = False


    End Sub

    Private Sub dgvFinnKunde_CellClick(sender As Object, e As DataGridViewCellEventArgs) Handles dgvFinnKunde.CellClick
        dgvFinnKunde.CurrentRow.Selected = True
        Dim radNr As Integer = dgvFinnKunde.CurrentRow.Index
        'MsgBox(tempTable.Rows(radNr).Item("personId").ToString)

        valgtKunde = New Kunde(tempTable.Rows(radNr).Item("personId").ToString)

        If radNr < dgvFinnKunde.RowCount - 1 Then
            txtValgtKundeNr.Text = tempTable.Rows(radNr).Item("personId").ToString
            txtValgtKundeFornavn.Text = tempTable.Rows(radNr).Item("personForNavn").ToString
            txtValgtKundeEtternavn.Text = tempTable.Rows(radNr).Item("personEtterNavn").ToString
            txtValgtKundeAdresse.Text = tempTable.Rows(radNr).Item("personAdresse").ToString
            txtValgtKundeEpost.Text = tempTable.Rows(radNr).Item("personEpost").ToString
            txtValgtKundeMobil.Text = tempTable.Rows(radNr).Item("personMobilTlf").ToString
            txtValgtKundeFakturaAdresse.Text = tempTable.Rows(radNr).Item("kundeFakturaAdresse").ToString
            txtValgtKundeRabatt.Text = tempTable.Rows(radNr).Item("kundeRabattFaktor").ToString
            txtValgtKundeAbonnement.Text = tempTable.Rows(radNr).Item("abonnementId").ToString

        End If

        Dim sql As String = "SELECT varesalg.varesalgsId, varesalg.bestillingsDato, varesalg.leveringsDato, kakeoppskrift.kakeNavn, kakepakke.kakePakkeUtsalgsPris, varesalg.status"
        sql = sql & " FROM varesalg INNER JOIN kakepakke INNER JOIN kakeoppskrift ON varesalg.varesalgsId = kakepakke.varesalgsId AND kakepakke.kakeId = kakeoppskrift.kakeId WHERE"
        sql = sql & " varesalg.kundeNr = '" & valgtKunde.id & "'"

        dgvBestillinger.DataSource = Database.Query(sql)

    End Sub

    Private Sub btnEndreKundeopplysninger_Click(sender As Object, e As EventArgs) Handles btnEndreKundeopplysninger.Click
        btnLagreEndretKundeInfo.Visible = True
        txtValgtKundeAbonnement.ReadOnly = False
        txtValgtKundeFornavn.ReadOnly = False
        txtValgtKundeAdresse.ReadOnly = False
        txtValgtKundeEpost.ReadOnly = False
        txtValgtKundeEtternavn.ReadOnly = False
        txtValgtKundeFakturaAdresse.ReadOnly = False
        txtValgtKundeMobil.ReadOnly = False
        txtValgtKundeRabatt.ReadOnly = False

    End Sub

    Private Sub btnRegistrerBestilling_Click(sender As Object, e As EventArgs) Handles btnRegistrerBestilling.Click
        FrmVaresalg.Show()
        TabKunderegisterLoad()

    End Sub

    'Her slutter kode for Kunderegister
    '*****************************************************************************************************

    '********************************************************************
    'Her begynner kode for Pakking:

    Private Sub btnHentPakkejobb_Click(sender As Object, e As EventArgs) Handles btnHentPakkejobb.Click
        Dim sql As String = "SELECT DISTINCT varesalg.varesalgsId,(SELECT COUNT(*) FROM kakepakke WHERE varesalgsId = varesalg.varesalgsId)"
        sql = sql & "AS Pakker, varesalg.leveringsDato, varesalg.status FROM varesalg INNER JOIN kakepakke "
        sql = sql & "ON varesalg.varesalgsId = kakepakke.varesalgsId WHERE varesalg.status='Bestilling mottatt' ORDER BY leveringsDato"

        dgvPakkejobber.DataSource = Database.Query(sql)
        With dgvPakkejobber.Columns
            .Item(0).Width = 70
            .Item(1).Width = 50
            .Item(2).Width = 75
            .Item(3).Width = 90

        End With
        If dgvPakkejobber.RowCount > 1 Then 'den første raden er tom, 1.pakkejobb i rad 2
            btnVelgPakkejobb.Enabled = True
        End If

    End Sub

    Private Sub dgvPakkejobber_CellClick(sender As Object, e As DataGridViewCellEventArgs) Handles dgvPakkejobber.CellClick
        dgvPakkejobber.CurrentRow.Selected = True

    End Sub

    Private Sub btnVelgPakkejobb_Click(sender As Object, e As EventArgs) Handles btnVelgPakkejobb.Click
        grpPakking.Visible = True
        'Henter navnet på alle kakene som inngår i pakkejobben/bestillingen og lister dem opp i bokser for kaker som skal pakkes:
        Dim sql As String = "SELECT kakeoppskrift.kakeNavn FROM kakeoppskrift INNER JOIN kakepakke INNER JOIN varesalg ON kakeoppskrift.kakeId = kakepakke.kakeId AND kakepakke.varesalgsId= varesalg.varesalgsId "
        sql = sql & "WHERE varesalg.varesalgsId ='" & dgvPakkejobber.CurrentRow.Cells.Item("varesalgsId").Value.ToString & "'"

        Dim tempTabell As DataTable = Database.Query(sql)

        dgvKakerSkalPakkes.DataSource = tempTabell

        lblKaker.Visible = True
        dgvKakerSkalPakkes.Visible = True

        dgvKakerSkalPakkes.Columns.Add("Pakket", "Pakket")

        Dim sql2 As String = "UPDATE varesalg SET status = 'Pakking startet' WHERE varesalgsId='" & dgvPakkejobber.CurrentRow.Cells.Item("varesalgsId").Value.ToString & "'"
        Database.Query(sql2)

        btnVelgPakkejobb.Enabled = False ' Hindrer at en ny pakkejobb hentes før valgte pakkejobb er ferdig

    End Sub

    Private Sub btnFerdigPakket_Click(sender As Object, e As EventArgs) Handles btnFerdigPakket.Click
        Dim antallIngredienser As Integer = chkIngredienserSkalPakkes.Items.Count
        Dim alleIngredienserErPakket As Boolean = False
        Dim alleKakerErPakket As Boolean = False

        If chkIngredienserSkalPakkes.CheckedItems.Count = antallIngredienser Then
            alleIngredienserErPakket = True
        End If

        If alleIngredienserErPakket = True Then
            MsgBox("Kaken er ferdig pakket.")

            For Each pakketInggrediens As String In chkIngredienserSkalPakkes.Items
                Dim deltstring = Split(pakketInggrediens, " ")
                Dim ingrediensNavn = deltstring(1)
                Dim antall As Integer = CInt(deltstring(0))

                Dim reduserIngrediens As New Ingrediens
                reduserIngrediens = Ingrediens.FinnByNavn(ingrediensNavn)

                reduserIngrediens.EndreBeholdning(antall * (-1))
            Next


            chkIngredienserSkalPakkes.Items.Clear()
            dgvKakerSkalPakkes.Enabled = True

            dgvKakerSkalPakkes.CurrentRow.Cells.Item("Pakket").Value = "JA"

            For i = 0 To dgvKakerSkalPakkes.Rows.Count - 1 Step 1   'Sjekker om det er flere kaker igjen å pakke i valgte pakkejobb
                If dgvKakerSkalPakkes.Rows.Item(i).Cells.Item("Pakket").Value = "JA" Then
                    alleKakerErPakket = True
                Else
                    alleKakerErPakket = False
                End If
            Next

            If alleKakerErPakket = True Then 'Hvis alle pakker er ferdig vises etikett-knappen
                btnEtikett.Visible = True
            End If

        End If
    End Sub

    Private Sub dgvKakerSkalPakkes_CellClick(sender As Object, e As DataGridViewCellEventArgs) Handles dgvKakerSkalPakkes.CellClick
        If dgvKakerSkalPakkes.CurrentRow.Cells.Item("Pakket").Value = "JA" Then
            MsgBox("Denne kaken er allerede pakket")
        Else

            Dim kakenavn As String = dgvKakerSkalPakkes.CurrentRow.Cells.Item("kakeNavn").Value

            Dim sql As String = "SELECT ingrediens.ingrediensNavn, kakeoppskriftingrediens.antall FROM ingrediens INNER JOIN kakeoppskrift INNER JOIN kakeoppskriftingrediens "
            sql = sql & "ON ingrediens.ingrediensId = kakeoppskriftingrediens.ingrediensId AND kakeoppskriftingrediens.kakeId = kakeoppskrift.kakeId "
            sql = sql & "WHERE kakeoppskrift.kakeNavn = '" & kakenavn & "'"

            Dim tempTabell As DataTable = Database.Query(sql)
            chkIngredienserSkalPakkes.Items.Clear()
            For Each rad As DataRow In tempTabell.Rows
                With chkIngredienserSkalPakkes.Items
                    .Add(rad.Item("antall") & " " & rad.Item("ingrediensNavn"))
                End With
            Next
            chkIngredienserSkalPakkes.Visible = True
            lblIngredienser.Visible = True
            btnFerdigPakket.Visible = True
            dgvKakerSkalPakkes.Enabled = False 'sperrer for muligheten til å velge ny kake før den valgte er pakket ferdig

        End If
    End Sub

    Private Sub btnEtikett_Click(sender As Object, e As EventArgs) Handles btnEtikett.Click
        FrmEtikettUtskrift.ShowDialog()
        TabPakkingLoad()
        btnVelgPakkejobb.Enabled = False

    End Sub

    'Her slutter koden for Pakking
    '***************************************************************

    '******************************************************
    'Her begynner kode for Kjøreliste-fanen:    

    Private Sub btnHentKjøreliste_Click(sender As Object, e As EventArgs) Handles btnHentKjøreliste.Click
        Dim sql As String = "SELECT DISTINCT varesalg.varesalgsId AS ID,(SELECT COUNT(*) FROM kakepakke WHERE varesalgsId = varesalg.varesalgsId)"
        sql = sql & "AS Pakker, varesalg.leveringsAdresse, varesalg.leveringsDato, varesalg.status FROM varesalg INNER JOIN kakepakke "
        sql = sql & "ON varesalg.varesalgsId = kakepakke.varesalgsId WHERE  status='Ferdig pakket' ORDER BY varesalg.leveringsDato"

        'MsgBox(datoKjøreliste.Value.ToString("yyyy-MM-dd"))

        dgvKjøreliste.DataSource = Database.Query(sql)

        With dgvKjøreliste.Columns
            .Item(0).Width = 20
            .Item(1).Width = 50
            .Item(2).Width = 170
            .Item(3).Width = 90

        End With

    End Sub

    Private Sub dgvKjøreliste_CellClick(sender As Object, e As DataGridViewCellEventArgs) Handles dgvKjøreliste.CellClick
        dgvKjøreliste.CurrentRow.Selected = True    'Velger hele raden hvis man klikker på en celle


    End Sub

    Private Sub btnSkrivUtKjøreliste_Click(sender As Object, e As EventArgs) Handles btnSkrivUtKjøreliste.Click
        FrmKjørelisteUtskrift.ShowDialog()

    End Sub

    Private Sub btnVisKart_Click(sender As Object, e As EventArgs) Handles btnVisKart.Click
        Try
            Dim rad As DataGridViewRow = dgvKjøreliste.CurrentRow
            Dim googleSøk As String = rad.Cells.Item("leveringsAdresse").Value.ToString
            Dim url As String = "https://maps.google.no/maps?output=svembed&q=" & Replace(googleSøk, " ", "+") & "&iwloc=near"
            webKart.Navigate(url, Nothing, Nothing, "User-Agent: Firefox")

        Catch ex As Exception
            MsgBox("Ingen adresse er valgt")

        End Try
    End Sub

    Private Sub btnSettLevert_Click(sender As Object, e As EventArgs) Handles btnSettLevert.Click
        For Each rad As DataGridViewRow In dgvKjøreliste.SelectedRows
            Dim sql As String = "UPDATE varesalg SET status='Levert' WHERE varesalgsId = '" & rad.Cells.Item("varesalgsId").Value.ToString & "'"
            Database.Query(sql)
        Next
        MsgBox("Alle markerte rader er registrert som 'Levert'")
    End Sub

    'Her slutter kode for Kjøreliste-fanen
    '*********************************************************************

    '**********************************************************************
    'Her begynner kode for Råvarelager-fanen:

    Private Sub cboVelgRavare_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cboVelgRavare.SelectedIndexChanged
        valgtIngrediens = cboVelgRavare.SelectedItem.ToString()

        For Each i In ingredienser
            If i.navn = valgtIngrediens Then
                lblRavareinfo.Text = i.navn.ToUpper & ":" & vbCrLf & "Innkjøpspris: " & i.innkjopspris & vbCrLf & "Utsalgsprisspris: " & i.utsalgspris & vbCrLf & "Beholdning: " & i.mengde
                btnEndreRavare.Text = "Endre beholdning av " & i.navn
                btnEndreRavare.Visible = True
            ElseIf valgtIngrediens = "Velg råvare" Then
                lblRavareinfo.Text = ""
                btnEndreRavare.Visible = False
            End If
        Next

    End Sub

    Private Sub btnEndreRavare_Click(sender As Object, e As EventArgs) Handles btnEndreRavare.Click

        Dim tittel As String = "Endre råvarebeholdning for " & valgtIngrediens
        Dim endringsOnske As String = "Tast inn beholdningsendring"

        Dim endring As String = (InputBox(endringsOnske, tittel))
        If endring = "" Then    'Hvis bruker klikker på cancel settes endringen til 0
            endring = 0
        End If
        Try
            valgtIngrediens = cboVelgRavare.Text
        Catch ex As Exception
            MsgBox("Tast inn navn og endring adskilt med mellomrom")
        End Try

        For Each i In ingredienser
            If i.navn = valgtIngrediens Then
                Dim rellEndring As Integer = CInt(i.EndreBeholdning(endring)) 'øker beholdning i ingrediens tabellen
            End If
            TabRavarelagerLoad()
        Next
    End Sub

    Private Sub btnNyRavare_Click(sender As Object, e As EventArgs) Handles btnNyRavare.Click
        txtNyRåvareNavn.Visible = True
        txtNyRåvareInnPris.Visible = True
        txtNyRåvareUtPris.Visible = True
        btnLagreNyRåvare.Visible = True

    End Sub

    Private Sub btnLagreNyRåvare_Click(sender As Object, e As EventArgs) Handles btnLagreNyRåvare.Click
        Try
            Dim nyvare As DataTable = Database.Query("SELECT ingrediensNavn FROM ingrediens WHERE ingrediensNavn='" & txtNyRåvareNavn.Text & "'")
            If nyvare.Rows.Count = 0 Then
                Ingrediens.AddIngrediens(txtNyRåvareNavn.Text, txtNyRåvareInnPris.Text, txtNyRåvareUtPris.Text, 0)
                MsgBox("Råvaren er lagt til i lageret.")
            Else
                MsgBox("Det finnes allerede en råvare med det navnet på lager.")
            End If

        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
        txtNyRåvareNavn.Visible = False
        txtNyRåvareInnPris.Visible = False
        txtNyRåvareUtPris.Visible = False
        btnLagreNyRåvare.Visible = False


    End Sub

    Private Sub btnEndreRåvarePris_Click(sender As Object, e As EventArgs) Handles btnEndreRåvarePris.Click
        Dim tittel As String = "Ny Råvarepris"
        Dim endringsOnske As String = "Tast inn ny innkjøpspris og utsalgspris separert med mellomrom"
        Dim nyVerdi As String
        Dim nyInnPris As UInteger = 0
        Dim nyUtPris As UInteger = 0
        valgtIngrediens = InputBox("Hvilken ingrediens skal endre pris?")
        nyVerdi = InputBox(endringsOnske, tittel)

        Try
            Dim tempString() As String = Split(nyVerdi)
            nyInnPris = CUInt(tempString(0))
            nyUtPris = CUInt(tempString(1))
        Catch ex As Exception
            MsgBox("Tast inn to tallverdier adskilt med mellomrom")
        End Try

        For Each i In ingredienser
            If i.navn = valgtIngrediens Then
                i.Lagre(nyInnPris, nyUtPris)                                     'kaller funksjon Lagre() i Ingrediens
            End If
            TabRavarelagerLoad()
        Next
    End Sub

    Private Sub btnRegRavarekjop_Click(sender As Object, e As EventArgs) Handles btnRegRavarekjop.Click
        Dim tittel As String = "Bestill mer av en råvare"
        Dim endringsOnske As String = "Tast inn råvarenavn og bestilt mengde separert med mellomrom"
        Dim nyVerdi As String
        Dim endring As Integer = 0
        nyVerdi = InputBox(endringsOnske, tittel)

        Try
            Dim tempString() As String = Split(nyVerdi)
            valgtIngrediens = tempString(0)
            endring = CInt(tempString(1))

            For Each i In ingredienser
                If i.navn = valgtIngrediens Then
                    Varekjop.NyttVarekjop(i, endring)
                End If
            Next

        Catch ex As Exception
            MsgBox("Tast inn navn og endring adskilt med mellomrom")
        End Try
        TabRavarelagerLoad()

    End Sub

    'Her slutter koden for råvarelager-fanen
    '*********************************************************************************************************

    '***********************************************************************************************************
    'Her begynner kode for Selgerrapport:

    Private Sub btnOppdaterSelgerrapport_Click(sender As Object, e As EventArgs) Handles btnOppdaterSelgerrapport.Click

        Ansatt.Selgerrapport(dgvSelgerRapport) 'NB sender inn referanse og ikke variabel

    End Sub


    'Her slutter kode for Selgerrapport
    '*********************************************************************************************************

    '******************************************************************************************************
    'Her begynner kode for Økonomirapport:

    Private Sub kjørProgbar()

        lblProgBarText.Visible = True
        lblProgBarText.Text = "Laster nytt Chart, vennligst vent!"
        progBarChart.Visible = True

        progBarChart.Value = 0

        Do
            Threading.Thread.Sleep(100)
            progBarChart.PerformStep()

        Loop Until progBarChart.Value >= progBarChart.Maximum

    End Sub

    Private Sub rapporter_Click(sender As Object, e As EventArgs) Handles btnVisLeveringerPrDato.Click, btnVisKakepakker.Click, btnVisVaresalgene.Click
        Dim DatoOgAnt As Dictionary(Of String, Integer) = Varesalg.FinnLevDatoOgAntall()

        Dim but As Button = sender

        kjørProgbar() 'rapportene tar tid å laste, må vise bruker at noe skjer

        Dim enRapport As New Rapport

        Select Case but.Text
            Case "Vis kakepakker"
                enRapport.tegnKakepakkeChart()
            Case "Vis avanse pr varesalg"
                enRapport.tegnVaresalgChart()
            Case "Vis levering pr dato"
                enRapport.tegnVaresalgPrDatoChart(DatoOgAnt)

        End Select

    End Sub


    Private Sub ToolTip1_Popup(sender As Object, e As EventArgs) Handles btnVisVaresalgene.MouseHover
        ToolTip1.SetToolTip(btnVisVaresalgene, "NB! Søket i database tar 5 - 10 sekunder...")
    End Sub




    'Her slutter kode for Økonomirapport
    '*******************************************************************************************************

    '******************************************************************************************************
    'Her begynner kode for Brukeradministrasjon:

    Private Sub dgvAnsattListe_CellClick(sender As Object, e As DataGridViewCellEventArgs) Handles dgvAnsattListe.CellClick
        dgvAnsattListe.CurrentRow.Selected = True

        valgtBruker = New Ansatt(CInt(dgvAnsattListe.CurrentRow.Cells.Item("personId").Value)) 'Finner ansattNr fra tabellen og sender til konstruktøren

        txtAnsattNr.Text = valgtBruker.id
        txtFornavn.Text = valgtBruker.fornavn
        txtEtternavn.Text = valgtBruker.etternavn
        txtAdresse.Text = valgtBruker.adresse
        txtEpost.Text = valgtBruker.epost
        txtMobil.Text = valgtBruker.mobil

        txtBrukernavn.Text = valgtBruker.brukernavn
        txtPassord.Text = valgtBruker.passord

        chkAdmin.Checked = valgtBruker.rolle_admin
        chkSalg.Checked = valgtBruker.rolle_selger
        chkLager.Checked = valgtBruker.rolle_lager

        grpPersonopplysninger.Visible = True
        grpBrukeropplysninger.Visible = True
        btnLagreOpplysninger.Visible = True

    End Sub

    Private Sub btnLagreOpplysninger_Click(sender As Object, e As EventArgs) Handles btnLagreOpplysninger.Click
        valgtBruker = New Ansatt

        With valgtBruker
            .id = txtAnsattNr.Text
            .fornavn = txtFornavn.Text
            .etternavn = txtEtternavn.Text
            .adresse = txtAdresse.Text
            .epost = txtEpost.Text
            .mobil = txtMobil.Text
            .brukernavn = txtBrukernavn.Text
            .passord = txtPassord.Text
            .rolle_admin = chkAdmin.Checked
            .rolle_selger = chkSalg.Checked
            .rolle_lager = chkLager.Checked
        End With

        If valgtBruker.id = 0 Then
            valgtBruker.LagreNy()
            MsgBox("Ny bruker er lagret.")
        Else
            valgtBruker.Lagre()
            MsgBox("Brukerinfo er lagret.")
        End If

    End Sub

    Private Sub btnNyBruker_Click(sender As Object, e As EventArgs) Handles btnNyBruker.Click

        txtAnsattNr.Text = 0
        txtFornavn.Text = ""
        txtEtternavn.Text = ""
        txtAdresse.Text = ""
        txtEpost.Text = ""
        txtMobil.Text = ""

        txtBrukernavn.Text = ""
        txtPassord.Text = ""

        chkAdmin.Checked = False
        chkSalg.Checked = False
        chkLager.Checked = False

        txtBrukernavn.ReadOnly = False

        grpPersonopplysninger.Visible = True
        grpBrukeropplysninger.Visible = True
        btnLagreOpplysninger.Visible = True

    End Sub


    'Her slutter kode for Brukeradministrasjon
    '******************************************************************************************************


    '***************************************************************
    'Her begynner kode for "Globale innstillinger-fanen": 

    Private Sub btrRegNyKakeoppskrift_Click(sender As Object, e As EventArgs) Handles btrRegNyKakeoppskrift.Click

        Dim tittel As String = "Ny Oppskrift"
        Dim brukerInfo As String = "Tast inn nytt kakenavn, mellomrom og en tekstbeskrivelse!"
        Dim nyVerdi As String
        Dim navn As String = ""
        Dim beskr As String = ""
        nyVerdi = InputBox(brukerInfo, tittel)

        Try
            Dim tempString() As String = Split(nyVerdi)
            navn = (tempString(0)) 'index 0 er kakenavn
            For teller As Integer = 1 To tempString.Count - 1
                beskr &= tempString(teller) & " " ' de andre indeksene er hvert ord i beskrivelsen
            Next

        Catch ex As Exception
            MsgBox("Tast inn to ord adskilt med mellomrom")
        End Try

        Dim PK As Integer = KakeOppskrift.AddOppskrift(navn, beskr) ' PK i kakeoppskrift-tabellen (kakeId)
        Dim nyOppskrift As New OppskriftIngrediens(PK)
        nyOppskrift.lesInnNyOppskrift()
        nyOppskrift.Lagre()

    End Sub

    'Her slutter kode for "Globale innstillinger-fanen"
    '******************************************************************************************************


End Class
